package com.example.launibleplugin.constants

import java.util.UUID

/**
 * 蓝牙常量定义
 * Function: 定义蓝牙通信相关的常量
 * Note: 包含UUID、超时时间、重连参数等配置
 */
object BluetoothConstants {
    
    // =========================== 服务和特征UUID ===========================
    
    /**
     * 呼吸家设备主服务UUID
     * Note: 根据呼吸家设备协议定义，实际使用时需要根据具体协议调整
     */
    val RESPIRATORY_SERVICE_UUID: UUID = UUID.fromString("0000180F-0000-1000-8000-00805F9B34FB")
    
    /**
     * 数据通知特征UUID
     * Note: 用于接收设备主动推送的数据
     */
    val DATA_NOTIFICATION_CHARACTERISTIC_UUID: UUID = UUID.fromString("00002A19-0000-1000-8000-00805F9B34FB")
    
    /**
     * 命令写入特征UUID
     * Note: 用于向设备发送控制命令
     */
    val COMMAND_WRITE_CHARACTERISTIC_UUID: UUID = UUID.fromString("00002A18-0000-1000-8000-00805F9B34FB")
    
    /**
     * 设备信息读取特征UUID
     * Note: 用于读取设备基本信息
     */
    val DEVICE_INFO_CHARACTERISTIC_UUID: UUID = UUID.fromString("00002A29-0000-1000-8000-00805F9B34FB")
    
    /**
     * 配置特征UUID
     * Note: 用于设备参数配置
     */
    val CONFIG_CHARACTERISTIC_UUID: UUID = UUID.fromString("00002A28-0000-1000-8000-00805F9B34FB")
    
    // =========================== 设备识别 ===========================
    
    /**
     * 呼吸家设备名称前缀列表
     * Note: 用于设备扫描时的过滤
     */
    val DEVICE_NAME_PREFIXES = listOf(
        "呼吸家",
        "HuXiJia",
        "Respiratory",
        "RESP",
        "HXJ"
    )
    
    /**
     * 设备制造商ID
     * Note: 用于设备识别
     */
    const val MANUFACTURER_ID = 0x004C // 示例ID，需要根据实际情况调整
    
    // =========================== 超时和重连配置 ===========================
    
    /**
     * 设备扫描超时时间（毫秒）
     */
    const val SCAN_TIMEOUT_MS = 10000L
    
    /**
     * 连接超时时间（毫秒）
     */
    const val CONNECTION_TIMEOUT_MS = 30000L
    
    /**
     * 数据读取超时时间（毫秒）
     */
    const val READ_TIMEOUT_MS = 5000L
    
    /**
     * 数据写入超时时间（毫秒）
     */
    const val WRITE_TIMEOUT_MS = 5000L
    
    /**
     * 最大重连尝试次数
     */
    const val MAX_RECONNECT_ATTEMPTS = 3
    
    /**
     * 重连间隔时间（毫秒）
     */
    const val RECONNECT_INTERVAL_MS = 2000L
    
    /**
     * 心跳间隔时间（毫秒）
     */
    const val HEARTBEAT_INTERVAL_MS = 30000L
    
    // =========================== 数据包配置 ===========================
    
    /**
     * 数据包最大长度
     */
    const val MAX_PACKET_SIZE = 512
    
    /**
     * 数据包头部长度
     */
    const val PACKET_HEADER_SIZE = 4
    
    /**
     * 数据包校验和长度
     */
    const val PACKET_CHECKSUM_SIZE = 2
    
    /**
     * MTU大小
     */
    const val DEFAULT_MTU_SIZE = 247
    
    // =========================== 命令定义 ===========================
    
    /**
     * 设备命令枚举
     * Function: 定义发送给设备的命令类型
     * Note: 根据呼吸家设备协议定义
     */
    enum class DeviceCommand(val code: Byte, val description: String) {
        START_MEASUREMENT(0x01, "开始测量"),
        STOP_MEASUREMENT(0x02, "停止测量"),
        GET_DEVICE_INFO(0x03, "获取设备信息"),
        SET_SAMPLING_RATE(0x04, "设置采样率"),
        GET_BATTERY_LEVEL(0x05, "获取电池电量"),
        CALIBRATE_DEVICE(0x06, "设备校准"),
        RESET_DEVICE(0x07, "重置设备"),
        HEARTBEAT(0x08, "心跳包"),
        GET_STATUS(0x09, "获取状态"),
        SET_CONFIG(0x0A, "设置配置")
    }
    
    // =========================== 响应码定义 ===========================
    
    /**
     * 设备响应码枚举
     * Function: 定义设备返回的响应状态码
     * Note: 用于解析设备响应
     */
    enum class ResponseCode(val code: Byte, val description: String) {
        SUCCESS(0x00, "成功"),
        INVALID_COMMAND(0x01, "无效命令"),
        INVALID_PARAMETER(0x02, "无效参数"),
        DEVICE_BUSY(0x03, "设备忙碌"),
        LOW_BATTERY(0x04, "电池电量低"),
        SENSOR_ERROR(0x05, "传感器错误"),
        CALIBRATION_REQUIRED(0x06, "需要校准"),
        UNKNOWN_ERROR(0xFF.toByte(), "未知错误")
    }
    
    // =========================== 数据格式 ===========================
    
    /**
     * 数据包起始标识
     */
    const val PACKET_START_MARKER: Byte = 0xAA.toByte()
    
    /**
     * 数据包结束标识
     */
    const val PACKET_END_MARKER: Byte = 0x55.toByte()
    
    /**
     * 数据包版本号
     */
    const val PACKET_VERSION: Byte = 0x01
    
    // =========================== 权限相关 ===========================
    
    /**
     * 蓝牙权限列表
     * Note: Android不同版本需要的权限
     */
    val BLUETOOTH_PERMISSIONS = arrayOf(
        android.Manifest.permission.BLUETOOTH,
        android.Manifest.permission.BLUETOOTH_ADMIN,
        android.Manifest.permission.ACCESS_COARSE_LOCATION,
        android.Manifest.permission.ACCESS_FINE_LOCATION
    )
    
    /**
     * Android 12+ 蓝牙权限
     */
    val BLUETOOTH_PERMISSIONS_API31 = arrayOf(
        android.Manifest.permission.BLUETOOTH_SCAN,
        android.Manifest.permission.BLUETOOTH_CONNECT,
        android.Manifest.permission.BLUETOOTH_ADVERTISE
    )
    
    // =========================== 日志标签 ===========================
    
    const val LOG_TAG_BLUETOOTH = "LaUniBle_Bluetooth"
    const val LOG_TAG_DATA = "LaUniBle_Data"
    const val LOG_TAG_CONNECTION = "LaUniBle_Connection"
    const val LOG_TAG_PARSER = "LaUniBle_Parser"
    const val LOG_TAG_PLUGIN = "LaUniBle_Plugin"
}